package ui;

import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;

import javax.swing.BorderFactory;
import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JComboBox;
import javax.swing.JDialog;
import javax.swing.JFileChooser;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.border.Border;


public class ConfiguracionInicial extends JDialog {

	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	private MouseListener clickTextoReproductor;
	private ConfiguracionInicial estaVentana;
	private JComboBox reproductores;
	private JTextField textoReproductor;
	private JTextField textoEncolar;
	private JTextField textoEncolarReproducir;
	private JTextField textoEncolarLista;
	private JTextField textoEncolarReproducirLista;
	private JLabel labelEncolar;
	private JLabel labelEncolarLista;
	private Component labelEncolarListaReproducir;
	private JLabel labelEncolarReproducir;
	private Component labelUbicacion;
	private JCheckBox crearBD;
	private boolean cambiarReproductor;
	private boolean cancelado;

	public ConfiguracionInicial(VentanaPrincipal padre, boolean cambiarReproductor) {
		
		super(padre, true);
		estaVentana = this;
		this.cambiarReproductor = cambiarReproductor;
		clickTextoReproductor = new MouseListener() {
			public void mouseReleased(MouseEvent arg0) {
				JFileChooser elegirDestino = new JFileChooser();
				elegirDestino.setFileSelectionMode(JFileChooser.FILES_ONLY);
				elegirDestino.setDialogTitle("Elija la ruta del ejecutable");
				int seleccion = elegirDestino.showDialog(estaVentana, "Aceptar");
				
				if (seleccion == JFileChooser.APPROVE_OPTION) {
					textoReproductor.setText(elegirDestino.getSelectedFile().getAbsolutePath());
				}
			}
			public void mousePressed(MouseEvent arg0) {}
			public void mouseExited(MouseEvent arg0) {}
			public void mouseEntered(MouseEvent arg0) {}
			public void mouseClicked(MouseEvent arg0) {	}
			
		};
		estaVentana.setContentPane(getPanelPrincipal());
		
		//Propiedades Frame Principal
		estaVentana.setResizable(false);
		estaVentana.setTitle("Song Launcher - Configuracion Inicial");
		estaVentana.setIconImage(Toolkit.getDefaultToolkit().getImage(getClass().getResource("/images/icono_muisca2.gif")));
		estaVentana.pack();
		estaVentana.setLocationRelativeTo(null);
		estaVentana.setVisible(true);
		
	}

	private JPanel getPanelPrincipal() {
		JPanel panel = new JPanel();
		panel.setLayout(new BoxLayout(panel, BoxLayout.PAGE_AXIS));
		panel.add(getSeleccionarReproductorPanel());
		panel.add(getOpcionesOtroReproductorPanel());
		
		if (!cambiarReproductor)
			panel.add(getCrearBDCheckBoxPanel());
		
		panel.add(getAceptarCancelarPanel());
		return panel;
	}

	private JPanel getOpcionesOtroReproductorPanel() {
		JPanel panelOpciones = new JPanel();
		
		Border paneEdge = BorderFactory.createEmptyBorder(10,20,10,20);
		panelOpciones.setBorder(paneEdge);
		panelOpciones.setLayout(new BoxLayout(panelOpciones, BoxLayout.Y_AXIS));
		panelOpciones.add(getUbicacionPanel());
		panelOpciones.add(getEncolarPanel());
		panelOpciones.add(getEncolarReproducirPanel());
		panelOpciones.add(getEncolarListaPanel());
		panelOpciones.add(getEncolarListaReproducirPanel());

		return panelOpciones;
	}

	private JPanel getEncolarListaPanel() {
		JPanel panelEncolar = new JPanel();
		Border paneEdge = BorderFactory.createEmptyBorder(5,0,0,0);
		panelEncolar.setBorder(paneEdge);
		panelEncolar.setLayout(new BoxLayout(panelEncolar, BoxLayout.X_AXIS));
		labelEncolarLista = new JLabel("Encolar Lista Temas ");
		labelEncolarLista.setEnabled(false);
		labelEncolarLista.setPreferredSize(new Dimension(225 ,15));
		textoEncolarLista = new JTextField();
		textoEncolarLista.setEnabled(false);
		textoEncolarLista.setEditable(false);
		textoEncolarLista.setPreferredSize(new Dimension(150, 20));
		textoEncolarLista.setToolTipText(	"<html>" +
												"Argumento que se le pasara al reproductor para <br />" +
												"solamente encolar una lista de temas.<br />" +
												"Ejemplo (mocp): -a" +
										 	"</html>");
		panelEncolar.add(labelEncolarLista,  BorderLayout.LINE_START);
		panelEncolar.add(textoEncolarLista,  BorderLayout.LINE_END);
		return  panelEncolar;
	}

	private JPanel getEncolarListaReproducirPanel() {
		JPanel panelEncolar = new JPanel();
		panelEncolar.setLayout(new BoxLayout(panelEncolar, BoxLayout.X_AXIS));
		Border paneEdge = BorderFactory.createEmptyBorder(5,0,0,0);
		panelEncolar.setBorder(paneEdge);
		labelEncolarListaReproducir = new JLabel("Encolar y Reproducir Lista Temas ");
		labelEncolarListaReproducir.setEnabled(false);
		labelEncolarListaReproducir.setPreferredSize(new Dimension(225,15));
		textoEncolarReproducirLista = new JTextField();
		textoEncolarReproducirLista.setEnabled(false);
		textoEncolarReproducirLista.setEditable(false);
		textoEncolarReproducirLista.setPreferredSize(new Dimension(150, 20));
		textoEncolarReproducirLista.setToolTipText(	"<html>" +
														"Argumento que se le pasara al reproductor para <br />" +
														"encolar una lista de temas y reproducirlas.<br />" +
														"Ejemplo (mocp): -aqep" +
		 											"</html>");
		panelEncolar.add(labelEncolarListaReproducir,  BorderLayout.LINE_START);
		panelEncolar.add(textoEncolarReproducirLista,  BorderLayout.LINE_END);
		return  panelEncolar;
	}

	private JPanel getEncolarReproducirPanel() {
		JPanel panelEncolar = new JPanel(); 
		panelEncolar.setLayout(new BoxLayout(panelEncolar, BoxLayout.X_AXIS));
		Border paneEdge = BorderFactory.createEmptyBorder(5,0,0,0);
		panelEncolar.setBorder(paneEdge);
		labelEncolarReproducir = new JLabel("Encolar y Reproducir Tema ");
		labelEncolarReproducir.setEnabled(false);
		labelEncolarReproducir.setPreferredSize(new Dimension(225 ,15));
		textoEncolarReproducir = new JTextField();
		textoEncolarReproducir.setEnabled(false);
		textoEncolarReproducir.setEditable(false);
		textoEncolarReproducir.setPreferredSize(new Dimension(150, 20));
		textoEncolarReproducir.setToolTipText(	"<html>" +
													"Argumento que se le pasara al reproductor para <br />" +
													"solamente encolar un tema y reproducirlo.<br />" +
													"Ejemplo (mocp): -qpa" +
		 										"</html>");
		panelEncolar.add(labelEncolarReproducir,  BorderLayout.LINE_START);
		panelEncolar.add(textoEncolarReproducir,  BorderLayout.LINE_END);
		return  panelEncolar;
	}

	private Component getEncolarPanel() {
		JPanel panelEncolar = new JPanel();
		panelEncolar.setLayout(new BoxLayout(panelEncolar, BoxLayout.X_AXIS));
		Border paneEdge = BorderFactory.createEmptyBorder(5,0,0,0);
		panelEncolar.setBorder(paneEdge);
		labelEncolar = new JLabel("Encolar Tema ");
		labelEncolar.setEnabled(false);
		labelEncolar.setPreferredSize(new Dimension(225,15));
		textoEncolar = new JTextField();
		textoEncolar.setPreferredSize(new Dimension(150, 20));
		textoEncolar.setEnabled(false);
		textoEncolar.setEditable(false);
		textoEncolar.setToolTipText("<html>" +
										"Argumento que se le pasara al reproductor para <br />" +
										"solamente encolar un tema.<br />" +
										"Ejemplo (mocp): -a" +
									"</html>");
		panelEncolar.add(labelEncolar,  BorderLayout.LINE_START);
		panelEncolar.add(textoEncolar,  BorderLayout.LINE_END);
		return  panelEncolar;
	}

	private JPanel getUbicacionPanel() {
		JPanel panelUbicacion = new JPanel();
		panelUbicacion.setLayout(new BoxLayout(panelUbicacion, BoxLayout.X_AXIS));
		Border paneEdge = BorderFactory.createEmptyBorder(5,0,0,0);
		panelUbicacion.setBorder(paneEdge);
		labelUbicacion = new JLabel("Ubicacion Reproductor ");
		labelUbicacion.setEnabled(false);
		labelUbicacion.setPreferredSize(new Dimension(225,15));
		textoReproductor = new JTextField();
		textoReproductor.setPreferredSize(new Dimension(150, 20));
		textoReproductor.setEnabled(false);
		textoReproductor.setEditable(false);
		textoReproductor.setToolTipText("<html>" +
											"Url del ejecutable del reproductor <br />" +
											"Ejemplo (mocp, por default): /usr/bin/mocp " +
										"</html>");
		panelUbicacion.add(labelUbicacion,  BorderLayout.LINE_START);
		panelUbicacion.add(textoReproductor,  BorderLayout.LINE_END);
		
		return panelUbicacion;
	}

	private JPanel getCrearBDCheckBoxPanel() {
		JPanel panel = new JPanel();
		JLabel label = new JLabel("Crear Base de Datos a continuacion");
		crearBD = new JCheckBox();
		panel.add(crearBD, BorderLayout.LINE_START);
		panel.add(label, BorderLayout.LINE_START);
		
		return panel;
	}

	private JPanel getAceptarCancelarPanel() {
		JPanel panel = new JPanel();
		JButton cancelar = new JButton("Cancelar");
		panel.add(cancelar, BorderLayout.LINE_START);
		cancelar.addActionListener(new ActionListener(){

			public void actionPerformed(java.awt.event.ActionEvent ev){
				cancelado = true;
				estaVentana.dispose();
			}
		});
		
		JButton aceptar = new JButton("Aceptar");
		aceptar.addActionListener(new ActionListener(){
			public void actionPerformed(java.awt.event.ActionEvent ev){
				try {
					
					String reproductor = (String) reproductores.getSelectedItem();
					if (reproductor.equals("otro")) {
						if ((textoEncolar.getText() == null) || (textoEncolarLista.getText() == null) || (textoEncolarReproducir.getText() == null) || (textoEncolarReproducirLista.getText() == null) || (textoReproductor.getText() == null)) {
							cancelado = true;
							throw new Exception("Todos los campos son obligatorios");
						}
					}	
					
					cancelado = false;
					estaVentana.dispose();
				}
				catch (Exception e) {
					JOptionPane.showConfirmDialog(estaVentana, e.getMessage(), "Error", JOptionPane.ERROR_MESSAGE);
				}
			}
		});
		panel.add(aceptar, BorderLayout.LINE_END);
		
		return panel;
	}

	private JPanel getSeleccionarReproductorPanel() {
		JPanel panel = new JPanel();
			
		JLabel label = new JLabel("Elija su reproductor: ");
		panel.add(label, BorderLayout.CENTER);
		reproductores = new JComboBox(new String[]{"mocp", "amarok", "rhythmbox", "vlc", "otro"});
		reproductores.addActionListener(new ActionListener() {
			
			public void actionPerformed(ActionEvent arg0) {
				String seleccionado = (String) reproductores.getSelectedItem();
				if (seleccionado == "otro") {
					textoReproductor.setEditable(true);
					textoReproductor.setEnabled(true);
					textoEncolar.setEditable(true);
					textoEncolar.setEnabled(true);
					textoEncolarLista.setEditable(true);
					textoEncolarLista.setEnabled(true);
					textoEncolarReproducir.setEditable(true);
					textoEncolarReproducir.setEnabled(true);
					textoEncolarReproducirLista.setEditable(true);
					textoEncolarReproducirLista.setEnabled(true);
					labelEncolar.setEnabled(true);
					labelEncolarLista.setEnabled(true);
					labelEncolarListaReproducir.setEnabled(true);
					labelEncolarReproducir.setEnabled(true);
					labelUbicacion.setEnabled(true);
					textoReproductor.addMouseListener(clickTextoReproductor);
				}
				else {
					textoReproductor.removeMouseListener(clickTextoReproductor);
					textoReproductor.setEditable(false);
					textoReproductor.setEnabled(false);
					textoEncolar.setEditable(false);
					textoEncolar.setEnabled(false);
					textoEncolarLista.setEditable(false);
					textoEncolarLista.setEnabled(false);
					textoEncolarReproducir.setEditable(false);
					textoEncolarReproducir.setEnabled(false);
					textoEncolarReproducirLista.setEditable(false);
					textoEncolarReproducirLista.setEnabled(false);
					labelEncolar.setEnabled(false);
					labelEncolarLista.setEnabled(false);
					labelEncolarListaReproducir.setEnabled(false);
					labelEncolarReproducir.setEnabled(false);
					labelUbicacion.setEnabled(false);
					
					
				}
			}
		});
		panel.add(reproductores, BorderLayout.CENTER);
			
		return panel;
	}
	
	public String getReproductorSeleccionado() {
		return (String) reproductores.getSelectedItem();
	}
	
	public boolean isCrearBDSelected() {
		if (crearBD.isSelected())
			return true;
			
		return false;
	}

	public String getUbuicacionOtroReproductor() {
		return textoReproductor.getText();
	}

	public String getComandoEncolarTema() {
		return textoEncolar.getText();
	}

	public String getComandoEncolarTemaReproducir() {
		return textoEncolarReproducir.getText();
	}

	public String getComandoEncolarLista() {
		return textoEncolarLista.getText();
	}

	public String getComandoEncolarListaReproducir() {
		return textoEncolarReproducirLista.getText();
	}

	public boolean fueCancelado() {
		return cancelado;
	}

}
